<?php

/**
 * Descripcion: Esta clase se encargara de validar cuando un usuario exista en el sistema y tenga las credenciales adecuadas. Se utilizar� en los archivos de configuracion yml de validacion del modulo de logueo.
 * Clase:		validacionLogin
 * Autor:		John R.Q.
 * Fecha L.M.:		24 - Octubre - 2007
 */


class validacionLogin extends sfValidator
{
	
	/**
	 * Funcion:  initialize. Es el constructor por defecto de php v. 5, se utilizara para setear los valores por        defecto de las variables de la clase.
	 */
	public function initialize ( $context, $parameters = null )
	{
		parent::initialize ( $context );
		$this -> getParameterHolder ( 'login_error', 'Datos Inv&aacute;lidos.' );
		$this -> getParameterHolder () -> add ( $parameters );
		return true;
	}



	/**
	* Funcion: execute. Es la funcion que inicia el proceso de validacion del usuario.
	*
	* @author 	John R.Q. <jorquin@univalle.edu.co>
	* @access    public
	* @copyright OITEL, Universidad del Valle 2.007
	* @since    2007-10-23 
	* @return  boolean
	*/
	public function execute ( &$value, &$error )
	{
		$log = new logReportes();
		
		$clave_param = $this -> getParameterHolder () -> get ( 'clave' );
		$usu_clave = $this -> getContext () -> getRequest () -> getParameter ( $clave_param );
		$usu_login = $value;
		
		$c = new Criteria();
		$c->add(KernelUsuarioPeer::USUARIO, $usu_login);
		$usuario = KernelUsuarioPeer::doSelectOne($c);

		if ( $usuario )
		{
			if ( sha1($usuario->getAleatorio().$usu_clave) == $usuario->getSha1Clave() )
			{
					$this->registrarUsuario($usuario);
					return true;			
			}
			else
			{
				$error = "Autenticaci�n fallada: contrase�a incorrecta para el usuario ".$usu_login;
				$log->logMensaje($error, "info");
				$error = $this -> getParameterHolder () -> get ( 'clave_error' );
				return false;
			}
			
		}
		$error = "Autenticaci�n fallada: No existe el usuario ".$usu_login;
		$log->logMensaje($error, "info");
		$error = $this -> getParameterHolder () -> get ( 'login_error' );
		return false;
	}



	/**
	* Se encarga de registrar el usuario para que symfony lo reconozca como tal
	*
	* @author 	John R.Q. <jorquin@univalle.edu.co>
	* @access   public
	* @copyright OITEL, Universidad del Valle 2.007
	* @since    2007-10-23 
	* @param 	$usu_login login del usuario
	* @return 	boolean
	*/
	function registrarUsuario($usuario="")
	{
	 		
		/************************************************************************
		en caso de que se quiera pasar el usuario que tiene certificado, pero no 
		tiene asociado un usuario en el sistema
		************************************************************************/
		if ( !isset($usuario) )
		{
			return false;
		}
		else if ( $usuario->getId()!="" )
		{
			$persona = KernelTerceroPeer::retrieveByPk($usuario->getTerceroId());
			if ( $persona )
				$nombre = $persona->getNombre().' ' . $persona->getPrimerApellido() .' '. $persona->getSegundoApellido();
		}
		
       // Kernel::setIPsAutorizados($usu_login, $usuario->getUsuIpsAutorizados());
	    Kernel::setLogin($usuario->getUsuario());
	    Kernel::setUsuarioId($usuario->getId());
    	Kernel::setNombre($nombre);
    	Kernel::getUser()->setAuthenticated(true);
		
		return true;
	}


	/**
     * Retorona TRUE si la contrase&ntilde;a del usuario ha expirado, para solicitarle que la cambie por una nueva.
     * Se debe verificar los siguientes atributos:
	 *		usu_fecha_inicial_cambio_contrasena
	 *		usu_fecha_modificacion
	 *		usu_timelive_contrasena
	 *
     * @author    John R.Q.     <jorquin@univalle.edu.co>
     * @access    public
     * @copyright	OITEL, Universidad del Valle 2.007
     * @since		2007-10-25
     * @return  	bool
     */
   /* public function contrasenaDeUsuarioHaExpirado ( $usuario ) 
    {
		
		if ( isset($usuario) )
		{
			$fechaActual = date('Y-m-d', time());
			$usu_fecha_inicial_cambio_contrasena = $usuario->getUsuFechaModContrasena();
			if ( trim($usu_fecha_inicial_cambio_contrasena) <> "" )
			{
				$diasDiferencia = $this->diferenciaFechas($usu_fecha_inicial_cambio_contrasena, $fechaActual);
				if ( $diasDiferencia > $usuario->getUsuTimeliveContrasena()  )
					$resp = TRUE;
			} // se comento para que permita el ingreso inmediato
			//else
			//	$resp = true; 
		}
		return $resp;
    }
    */

    
	/**
	* Se encarga de comparar dos fechas y reornar el n�mero de dias de diferencia entre las dos
	*
	* @author 	John R.Q. <jorquin@univalle.edu.co>
	* @access   public
	* @copyright OITEL, Universidad del Valle 2.007
	* @since    2007-10-23 
	* @param 	$fecha1 fecha inicial, $fecha2 fecha final. El formado de las fechas DEBE ser: 'aaaa-mm-dd'
	* @return 	boolean
	*/
	/*private function diferenciaFechas($fecha1, $fecha2)
	{	
		list($agno2,$mes2,$dia2)=split("-",$fecha1);
		list($agno1,$mes1,$dia1)=split("-",$fecha2);
		$diferencia = mktime(0,0,0,$mes1,$dia1,$agno1) - mktime(0,0,0, $mes2,$dia2,$agno2);
        return  $diferencia = ($diferencia/86400);
	}*/
}
?>
